/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "材质.h"
#include "预设材质.h"

#include "core/shader_PBR.h"
#include "纹理/纹理.h"
#include "底层绘图/intern/绘图框架.h"



S_材质管线* f_material_createPBR() {
	S_材质管线* mat = new S_材质管线();
	f_material_创建材质属性(mat);

	if (S_全局缓存::g_属性索引) {
		mat->m_材质自定义属性索引 = f_bm_alloc(S_全局缓存::g_属性索引, DEF_网格自定义属性槽数量 * DEF_网格自定义属性槽数量);

		for (uint32 i = 0; i < DEF_网格自定义属性槽数量 * DEF_网格自定义属性槽数量; ++i) {
			f_buf_属性索引_at(mat->m_材质自定义属性索引, i) = {};
		}
	}

	return mat;
}

void f_material_releasePBR(S_材质管线* mat) {
	f_bm_erase(mat->m_材质属性);
	delete mat;
}






void f_material_创建预设材质(S_设备环境& ctx) {

	f_g_预设材质().g_基本光照面材质 = new S_面基本光照材质(ctx);
	f_g_预设材质().g_基本光照点材质 = new S_基本光照点材质(ctx);
	f_g_预设材质().g_基本光照线材质 = new S_线基本光照材质(ctx);
	f_g_预设材质().g_基本光照线段材质 = new S_线基本光照材质(ctx, E_绘制方式::e_画线段);

	f_g_预设材质().g_PBR = new S_PBR材质(ctx);
	f_material_创建材质属性(f_g_预设材质().g_PBR);

	f_g_预设材质().g_Sky = new S_天空材质(ctx);
	f_material_创建材质属性(f_g_预设材质().g_Sky);

	f_g_预设材质().g_PBR线段材质 = f_material_创建PBR线段(ctx);

	f_g_预设材质().g_线段材质 = new S_线段材质(ctx);

}

void f_material_销毁预设材质() {
	if (f_g_预设材质().g_基本光照面材质) {
		delete f_g_预设材质().g_基本光照面材质;
		f_g_预设材质().g_基本光照面材质 = nullptr;
	}
	if (f_g_预设材质().g_基本光照点材质 != nullptr) {
		delete f_g_预设材质().g_基本光照点材质;
		f_g_预设材质().g_基本光照点材质 = nullptr;
	}
	if (f_g_预设材质().g_基本光照线材质) {
		delete f_g_预设材质().g_基本光照线材质;
		f_g_预设材质().g_基本光照线材质 = nullptr;
	}
	if(f_g_预设材质().g_基本光照线段材质) {
		delete f_g_预设材质().g_基本光照线段材质;
		f_g_预设材质().g_基本光照线段材质 = nullptr;
	}
	if (f_g_预设材质().g_PBR) {
		delete f_g_预设材质().g_PBR;
		f_g_预设材质().g_PBR = nullptr;
	}
	if (f_g_预设材质().g_PBR_Shadow) {
		delete f_g_预设材质().g_PBR_Shadow;
		f_g_预设材质().g_PBR_Shadow = nullptr;
	}
	if (f_g_预设材质().g_Sky) {
		delete f_g_预设材质().g_Sky;
		f_g_预设材质().g_Sky = nullptr;
	}
	if (f_g_预设材质().g_PBR线段材质) {
		delete f_g_预设材质().g_PBR线段材质;
		f_g_预设材质().g_PBR线段材质 = nullptr;
	}
	if (f_g_预设材质().g_线段材质) {
		delete f_g_预设材质().g_线段材质;
		f_g_预设材质().g_线段材质 = nullptr;
	}
}

void f_material_创建材质属性(S_材质管线* mat) {
	S_Material rayMaterial = f_material_init();
	mat->m_材质属性 = f_bm_alloc(f_buf_getGlobal().g_材质, 1);

	*f_buf_Material_ptr(mat->m_材质属性) = rayMaterial;
	mat->m_材质属性ID = mat->m_材质属性.m_Mem.m_偏移;

}

S_Material* f_material_get材质属性(S_材质管线* mat) {
	assert(mat->m_材质属性.m_Mem.m_数量);
	return f_buf_Material_ptr(mat->m_材质属性);
}

S_材质管线* f_material_创建基本光照点(S_设备环境& ctx) {
	return new S_基本光照点材质(ctx);
}

S_材质管线* f_material_创建天空材质(S_设备环境& ctx) {
	auto* 天空材质 = new S_天空材质(ctx);
	f_material_创建材质属性(天空材质);
	return 天空材质;
}

S_材质管线* f_material_创建PBR材质(S_设备环境& ctx) {
	auto* 材质 = new S_PBR材质(ctx);
	f_material_创建材质属性(材质);
	return 材质;
}

S_材质管线* f_material_创建PBR线段(S_设备环境& ctx) {
	auto* 材质 = new S_PBR线段材质(ctx);
	f_material_创建材质属性(材质);
	return 材质;
}

void f_material_创建纹理槽(S_材质管线* mat, S_纹理集** 纹理集, uint32 纹理集数量, uint32 绑定位置) {
	mat->m_纹理槽 = f_纹理槽_创建(纹理集数量);

	if (纹理集 && 纹理集数量) {
		f_纹理槽_填充纹理集(mat->m_纹理槽, 纹理集数量, 纹理集, 绑定位置);
	}
}









